package com.canoe.text.common;

import com.canoe.common.CanoeException;
import com.canoe.parameter.IParameter;
import org.apache.commons.lang3.StringUtils;

/**
 * 针对于text文件进行操作处理的命令参数
 *
 * @author: btm
 * @time: 21:30 2020/9/21
 **/
public enum TextParameter implements IParameter {

    /**
     * 正则表达式参数
     */
    REGEX("--regex","正则表达式","setRegex", true),
    /**
     * 待解析的文件路径参数
     */
    SOURCE_FILE_PATH("--source-path", "待解析文件路径","setSourceFilePath", true),

    TARGET_FILE_PATH("--target-path","生成目标文件路径","setTargetFilePath", true),
    /**
     * 待解析的文件路径参数<br/>
     * 与FILE_LIST一起使用
     */
    SOURCE_FILE_BASE_PATH("--source-base-path","待解析文件基础路径","setSourceFileBasePath", true),

    /**
     * 待解析的文件列表<br/>
     * 与SOURCE_FILE_BASE_PATH一起使用
     */
    FILE_LIST("--file-list","待处理文件列表","setFileNameList", true),

    /**
     * 是否只提取每一行中第一次匹配到的数据
     */
    FIRST_ONE("--first-one", "是否只提取第一个匹配到的数据", "setFirstOne", false),

    /**
     * 是否将提取到的内容都合并为一行
     */
    SINGLE_LINE("--single-line","是否将提取到的内容都合并为一行", "setSingleLine", false),

    /**
     * 数据前缀
     */
    PREFIX("--prefix","数据前缀","setPrefix", true),

    /**
     * 数据后缀
     */
    SUFFIX("--suffix","数据后缀", "setSuffix", true),

    ;

    private String parameterName;
    private String desc;
    private int index;
    private String setMethodName;
    /**当前参数是否提供参数值**/
    private boolean hasValue;

    TextParameter(String parameterName, String desc, String setMethodName,boolean hasValue) {
        this.parameterName = parameterName;
        this.desc = desc;
        this.setMethodName = setMethodName;
        this.hasValue = hasValue;
    }

    /**
     * 通过命令的名字，找到对应的命令
     * @param parameterName 参数名称
     * @return TextParameter
     */
    public static TextParameter findByParameterName(String parameterName) {
        if (StringUtils.isNotBlank(parameterName)) {
            for (TextParameter textParameter : TextParameter.values()) {
                if (parameterName.equals(textParameter.getParameterName())) {
                    return textParameter;
                }
            }
        }
        throw new CanoeException("unsupported text parameter: " + parameterName);
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public int getIndex() {
        return index;
    }

    public String getParameterName() {
        return parameterName;
    }

    public String getSetMethodName() {
        return setMethodName;
    }

    public boolean isHasValue() {
        return this.hasValue;
    }

    @Override
    public String parserParameterFileSetMethodName(String parameterName) {
        return findByParameterName(parameterName).getSetMethodName();
    }
}
